Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


meshchatx/src/backend/database/provider.py 7e57cc2b24dcf099ca208a2750b68633672f22da (7e57cc2b) Text, 6.58 KB

Tff7b72import T7ee787sqlite3
Tff7b72import T7ee787threading
Tff7b72import T7ee787weakref


Tff7b72class T56d364DatabaseProviderTb4b4b4:
Te6edf3_instance Tff7b72= Tff7b72None
Te6edf3_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffLockTb4b4b4(Tb4b4b4)
Te6edf3_all_locals Tff7b72= Te6edf3weakrefTff7b72.Td2a8ffWeakSetTb4b4b4(Tb4b4b4)

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3db_pathTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdb_path Tff7b72= Te6edf3db_path
Tff7b72selfTff7b72.Td2a8ff_local Tff7b72= Te6edf3threadingTff7b72.Td2a8fflocalTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_all_localsTff7b72.Td2a8ffaddTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_localTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_memory_connection Tff7b72= Tff7b72None

Tf0883e@classmethod
Tff7b72def Td2a8ffget_instanceTb4b4b4(Tff7b72clsTb4b4b4, Te6edf3db_pathTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72clsTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Tff7b72clsTff7b72.Td2a8ff_instance Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3db_path Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffDatabase path must be provided for the first initializationTa5d6ff"
Tff7b72raise Tf85149ValueErrorTb4b4b4(Te6edf3msgTb4b4b4)
Tff7b72clsTff7b72.Td2a8ff_instance Tff7b72= Tff7b72clsTb4b4b4(Te6edf3db_pathTb4b4b4)
Tff7b72elif Te6edf3db_path Tff7b72is Tff7b72not Tff7b72None Tff7b72and Tff7b72clsTff7b72.Td2a8ff_instanceTff7b72.Td2a8ffdb_path Tff7b72!= Te6edf3db_pathTb4b4b4:
T8b949e# If a different path is provided, close the old one and create new
Tff7b72clsTff7b72.Td2a8ff_instanceTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72clsTff7b72.Td2a8ff_instance Tff7b72= Tff7b72clsTb4b4b4(Te6edf3db_pathTb4b4b4)
Tff7b72return Tff7b72clsTff7b72.Td2a8ff_instance

Tf0883e@property
Tff7b72def Td2a8ffconnectionTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e# In-memory databases are private to the connection.
T8b949e# If we use threading.local(), each thread gets a DIFFERENT in-memory database.
T8b949e# For :memory:, we must share the connection across threads.
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdb_path Tff7b72== Ta5d6ff"Ta5d6ff:memory:Ta5d6ff"Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_memory_connection Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_memory_connection Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_memory_connection Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4,
Te6edf3check_same_threadTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3isolation_levelTff7b72=Tff7b72NoneTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_memory_connectionTff7b72.Td2a8ffrow_factory Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffRow
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_memory_connection

Tff7b72if Tff7b72not Tffa657hasattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_localTb4b4b4, Ta5d6ff"Ta5d6ffconnectionTa5d6ff"Tb4b4b4)Tb4b4b4:
T8b949e# isolation_level=None enables autocommit mode, letting us manage transactions manually
Tff7b72selfTff7b72.Td2a8ff_localTff7b72.Td2a8ffconnection Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffdb_pathTb4b4b4,
Te6edf3check_same_threadTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3isolation_levelTff7b72=Tff7b72NoneTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_localTff7b72.Td2a8ffconnectionTff7b72.Td2a8ffrow_factory Tff7b72= Te6edf3sqlite3Tff7b72.Td2a8ffRow
T8b949e# Enable WAL mode for better concurrency
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdb_path Tff7b72!= Ta5d6ff"Ta5d6ff:memory:Ta5d6ff"Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_localTff7b72.Td2a8ffconnectionTff7b72.Td2a8ffexecuteTb4b4b4(Ta5d6ff"Ta5d6ffPRAGMA journal_mode=WALTa5d6ff"Tb4b4b4)
Tff7b72except Te6edf3sqlite3Tff7b72.Td2a8ffOperationalErrorTb4b4b4:
T8b949e# Some environments might not support WAL
Tff7b72pass
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_localTff7b72.Td2a8ffconnection

Tff7b72def Td2a8ffexecuteTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3queryTb4b4b4, Te6edf3paramsTff7b72=Tff7b72NoneTb4b4b4, Te6edf3commitTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3cursor Tff7b72= Tff7b72selfTff7b72.Td2a8ffconnectionTff7b72.Td2a8ffcursorTb4b4b4(Tb4b4b4)

T8b949e# Convert any datetime objects in params to ISO strings to avoid DeprecationWarning in Python 3.12+
Tff7b72if Te6edf3paramsTb4b4b4:
Tff7b72from T7ee787datetime Tff7b72import Te6edf3datetime

Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3paramsTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Te6edf3params Tff7b72= Tb4b4b4{
Te6edf3kTb4b4b4: Tb4b4b4(Te6edf3vTff7b72.Td2a8ffisoformatTb4b4b4(Tb4b4b4) Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3vTb4b4b4, Te6edf3datetimeTb4b4b4) Tff7b72else Te6edf3vTb4b4b4)
Tff7b72for Te6edf3kTb4b4b4, Te6edf3v Tff7b72in Te6edf3paramsTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72elseTb4b4b4:
Te6edf3params Tff7b72= Tffa657tupleTb4b4b4(
Tb4b4b4(Te6edf3pTff7b72.Td2a8ffisoformatTb4b4b4(Tb4b4b4) Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3pTb4b4b4, Te6edf3datetimeTb4b4b4) Tff7b72else Te6edf3pTb4b4b4) Tff7b72for Te6edf3p Tff7b72in Te6edf3params
Tb4b4b4)

Tff7b72if Te6edf3paramsTb4b4b4:
Te6edf3cursorTff7b72.Td2a8ffexecuteTb4b4b4(Te6edf3queryTb4b4b4, Te6edf3paramsTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3cursorTff7b72.Td2a8ffexecuteTb4b4b4(Te6edf3queryTb4b4b4)

T8b949e# In autocommit mode (isolation_level=None), in_transaction is True
T8b949e# only if we explicitly started one with BEGIN and haven't committed/rolled back.
Tff7b72if Te6edf3commit Tff7b72is Tff7b72TrueTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconnectionTff7b72.Td2a8ffcommitTb4b4b4(Tb4b4b4)
Tff7b72elif Te6edf3commit Tff7b72is Tff7b72FalseTb4b4b4:
Tff7b72pass
T8b949e# Default behavior: if we're in a manual transaction, don't commit automatically
Tff7b72elif Tff7b72not Tff7b72selfTff7b72.Td2a8ffconnectionTff7b72.Td2a8ffin_transactionTb4b4b4:
T8b949e# In autocommit mode, non-DML statements don't start transactions.
T8b949e# DML statements might if they are part of a BEGIN block.
T8b949e# Actually, in isolation_level=None, NOTHING starts a transaction unless we say BEGIN.
Tff7b72pass
Tff7b72return Te6edf3cursor

Tff7b72def Td2a8ffbeginTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconnectionTff7b72.Td2a8ffexecuteTb4b4b4(Ta5d6ff"Ta5d6ffBEGINTa5d6ff"Tb4b4b4)
Tff7b72except Te6edf3sqlite3Tff7b72.Td2a8ffOperationalError Tff7b72as Te6edf3eTb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6ffwithin a transactionTa5d6ff" Tff7b72in Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4:
Tff7b72pass
Tff7b72elseTb4b4b4:
Tff7b72raise

Tff7b72def Td2a8ffcommitTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffconnectionTff7b72.Td2a8ffin_transactionTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconnectionTff7b72.Td2a8ffcommitTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffrollbackTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffconnectionTff7b72.Td2a8ffin_transactionTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconnectionTff7b72.Td2a8ffrollbackTb4b4b4(Tb4b4b4)

Tff7b72def Tff7b72__enter__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffbeginTb4b4b4(Tb4b4b4)
Tff7b72return Tff7b72self

Tff7b72def Tff7b72__exit__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3exc_typeTb4b4b4, Te6edf3exc_valTb4b4b4, Te6edf3exc_tbTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3exc_typeTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrollbackTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcommitTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8fffetchoneTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3queryTb4b4b4, Te6edf3paramsTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3cursor Tff7b72= Tff7b72selfTff7b72.Td2a8ffexecuteTb4b4b4(Te6edf3queryTb4b4b4, Te6edf3paramsTb4b4b4)
Te6edf3row Tff7b72= Te6edf3cursorTff7b72.Td2a8fffetchoneTb4b4b4(Tb4b4b4)
Tff7b72return Tffa657dictTb4b4b4(Te6edf3rowTb4b4b4) Tff7b72if Te6edf3row Tff7b72else Tff7b72None

Tff7b72def Td2a8fffetchallTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3queryTb4b4b4, Te6edf3paramsTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3cursor Tff7b72= Tff7b72selfTff7b72.Td2a8ffexecuteTb4b4b4(Te6edf3queryTb4b4b4, Te6edf3paramsTb4b4b4)
Te6edf3rows Tff7b72= Te6edf3cursorTff7b72.Td2a8fffetchallTb4b4b4(Tb4b4b4)
Tff7b72return Tb4b4b4[Tffa657dictTb4b4b4(Te6edf3rowTb4b4b4) Tff7b72for Te6edf3row Tff7b72in Te6edf3rowsTb4b4b4]

Tff7b72def Td2a8ffcloseTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdb_path Tff7b72== Ta5d6ff"Ta5d6ff:memory:Ta5d6ff" Tff7b72and Tff7b72selfTff7b72.Td2a8ff_memory_connectionTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_memory_connectionTff7b72.Td2a8ffcommitTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_memory_connectionTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4: T8b949e# noqa: S110
Tff7b72pass
Tff7b72selfTff7b72.Td2a8ff_memory_connection Tff7b72= Tff7b72None

Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_localTb4b4b4, Ta5d6ff"Ta5d6ffconnectionTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcommitTb4b4b4(Tb4b4b4) T8b949e# Ensure everything is saved
Tff7b72selfTff7b72.Td2a8ff_localTff7b72.Td2a8ffconnectionTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4: T8b949e# noqa: S110
Tff7b72pass
Tff7b72del Tff7b72selfTff7b72.Td2a8ff_localTff7b72.Td2a8ffconnection

Tff7b72def Td2a8ffclose_allTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_memory_connectionTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_memory_connectionTff7b72.Td2a8ffcommitTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_memory_connectionTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4: T8b949e# noqa: S110
Tff7b72pass
Tff7b72selfTff7b72.Td2a8ff_memory_connection Tff7b72= Tff7b72None

Tff7b72for Te6edf3loc Tff7b72in Tff7b72selfTff7b72.Td2a8ff_all_localsTb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3locTb4b4b4, Ta5d6ff"Ta5d6ffconnectionTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3locTff7b72.Td2a8ffconnectionTff7b72.Td2a8ffcommitTb4b4b4(Tb4b4b4)
Te6edf3locTff7b72.Td2a8ffconnectionTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4: T8b949e# noqa: S110
Tff7b72pass
Tff7b72del Te6edf3locTff7b72.Td2a8ffconnection

Tff7b72def Td2a8ffvacuumTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e# VACUUM cannot run inside a transaction
Tff7b72selfTff7b72.Td2a8ffcommitTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffconnectionTff7b72.Td2a8ffexecuteTb4b4b4(Ta5d6ff"Ta5d6ffVACUUMTa5d6ff"Tb4b4b4)

Tff7b72def Td2a8ffintegrity_checkTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8fffetchallTb4b4b4(Ta5d6ff"Ta5d6ffPRAGMA integrity_checkTa5d6ff"Tb4b4b4)

Tff7b72def Td2a8ffquick_checkTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8fffetchallTb4b4b4(Ta5d6ff"Ta5d6ffPRAGMA quick_checkTa5d6ff"Tb4b4b4)

Tff7b72def Td2a8ffcheckpointTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8fffetchallTb4b4b4(Ta5d6ff"Ta5d6ffPRAGMA wal_checkpoint(TRUNCATE)Ta5d6ff"Tb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────